#ifndef DEV_SERIAL_H
#define DEV_SERIAL_H

#include <QSerialPort>
#include <QSerialPortInfo>
#include <QString>
/*串口数据类型枚举*/
typedef enum
{
    DEV_SERIAL_DISPLAY_CHAR, // 字符显示
    DEV_SERIAL_DISPLAY_HEX, // 十六进制显示
    DEV_SERIAL_DISPLAY_DEC, // 十进制显示
}DEV_SERIAL_DISPLAY_ENUM;
/*串口操作错误枚举*/
typedef enum
{
    DEV_SERIAL_ERROR_NONE,          // 没有错误
    DEV_SERIAL_IS_OPENED,           // 串口已打开（无需再次打开）
    DEV_SERIAL_OPEN_ERROR,          // 串口打开错误
    DEV_SERIAL_IS_CLOSED,           // 串口已关闭
    DEV_SERIAL_ERROR_SEND,          // 发送数据出错
    DEV_SERIAL_ERROR_READ,          // 读取数据出错
}DEV_SERIAL_ERROR_CODE_ENUM;
/*数据位枚举*/
typedef enum
{
    DEV_SERIAL_DATABITS_8,  // 数据位8
    DEV_SERIAL_DATABITS_7,  // 数据位7
    DEV_SERIAL_DATABITS_6,  // 数据位6
    DEV_SERIAL_DATABITS_5,  // 数据位5
}DEV_SERIAL_DATABITS_ENUM;
/*校验位枚举*/
typedef enum
{
    DEV_SERIAL_PARITY_N,    // 无校验
    DEV_SERIAL_PARITY_O,    // 奇校验
    DEV_SERIAL_PARITY_E,    // 偶校验
}DEV_SERIAL_PARITY_ENUM;
/*停止位枚举*/
typedef enum
{
    DEV_SERIAL_STOPBITS_1,      // 1位停止位
    DEV_SERIAL_STOPBITS_1_5,    // 1.5位停止位
    DEV_SERIAL_STOPBITS_2,      // 2位停止位
}DEV_SERIAL_STOPBITS_ENUM;
/*串口结构体*/
typedef struct
{
    QStringList                 serial_name_buf;        // 串口名称缓存
    QString                     serial_name;            // 选择的串口名称
    QSerialPort                 serial_port;            // 串口
    qint32                      serial_baudrate;        // 串口波特率
    QSerialPort::DataBits       serial_databits;        // 串口数据位
    QSerialPort::StopBits       serial_stopbits;        // 串口停止位
    QSerialPort::FlowControl    serial_flowcontrol;     // 串口流控
    QSerialPort::Parity         serial_parity;          // 串口校验
    DEV_SERIAL_DISPLAY_ENUM     serial_display_type;    // 显示类型
    DEV_SERIAL_DISPLAY_ENUM     serial_send_data_type;  // 发送类型
}DEV_SERIAL_STR;

/*
 * 函数声明区
*/
/* 扫描串口*/
void DEV_Scan_Serial_Port(DEV_SERIAL_STR *serial);
/*
 * 设置串口参数
*/
void DEV_Serial_Config(DEV_SERIAL_STR *port_parameter);
/*
 * 打开串口
 * 此函数调用前必须先设置串口参数
*/
int DEV_Serial_Open(DEV_SERIAL_STR *port_parameter);
/*
 * 关闭串口
*/
int DEV_Serial_Close(DEV_SERIAL_STR *port_parameter);
/*
 * 设置串口名称
*/
void DEV_Set_Serial_Name(DEV_SERIAL_STR *port_parameter, QString portname);
/*
*设置串口波特率
*/
void DEV_Set_Serial_Baudrate(DEV_SERIAL_STR *port_parameter, int baudrate);
/*
 * 设置数据位
 * 默认为8
 *
*/
void DEV_Set_Serial_Databits(DEV_SERIAL_STR *port_parameter, DEV_SERIAL_DATABITS_ENUM databits);
/*
 * 设置停止位
 * 默认为1
*/
void DEV_Set_Serial_Stopbits(DEV_SERIAL_STR *port_parameter, DEV_SERIAL_STOPBITS_ENUM stopbits);
/*
 * 设置校验位
 * 默认无校验
*/
void DEV_Set_Serial_Parity(DEV_SERIAL_STR *port_parameter, DEV_SERIAL_PARITY_ENUM parity);
/*
 * 设置流量控制
 * 默认无
 * 0：无流控 1：硬件流控
*/
void DEV_Set_Serial_Flowcontrol(DEV_SERIAL_STR *port_parameter, bool flow);
/*设置串口显示类型*/
void DEV_Set_Serial_Display_Type(DEV_SERIAL_STR *port_parameter, DEV_SERIAL_DISPLAY_ENUM type);
DEV_SERIAL_DISPLAY_ENUM DEV_Get_Serial_Display_Type(DEV_SERIAL_STR *port_parameter);
/*设置串口发送数据类型*/
void DEV_Set_Serial_Send_Data_Type(DEV_SERIAL_STR *port_parameter, DEV_SERIAL_DISPLAY_ENUM type);
DEV_SERIAL_DISPLAY_ENUM DEV_Get_Serial_Send_Data_Type(DEV_SERIAL_STR *port_parameter);
/*串口发送数据*/
int DEV_Serial_Send_Data(DEV_SERIAL_STR *serial, QByteArray send_data);
/*串口接收数据*/
QByteArray DEV_Serial_Receive_Data(DEV_SERIAL_STR *serial);
#endif // DEV_SERIAL_H
